package org.example.aop;

/**
 * Company 源辰信息
 *
 * @author navy
 * @date 2024/4/20
 * Email haijunzhou@hnit.edu.cn
 */
public class StaticProxy {

    public static void main(String[] args) {
        // 基于接口实现的代理
        System.out.println("------------基于接口实现的代理----------------");
        A c = new C();
        c.test();
        System.out.println("------------基于继承实现的代理----------------");
        A d = new D();
        d.test();
    }
}

// 基于接口的代理
interface A {
    void test();
}

// 真实主题: 房东, 原告 ...
class B implements A{
    @Override
    public void test() {
        System.out.println("test");
    }
}

// 代理主题: 中介, 律师...
class C implements A {

    A a = new B();

    @Override
    public void test() {
        System.out.println("============ 前置增强");
        a.test();
        System.out.println("============ 后置增强");
    }
}

// 基于继承的代理
class D extends B {
    @Override
    public void test() {
        System.out.println("============ 前置增强");
        super.test();
        System.out.println("============ 后置增强");
    }
}


/**
 *         A
 *         |
 * ------------------
 *   B          C        B C 是 兄弟关系
 *   |
 *   D                   B D 是 父子关系
 *
 *   A b = new B();    对的
 *   B b = new B();    对的    没有 AOP 增强
 *   B b = new C();    错误      有 AOP 增强  不能指向兄弟(代理)对象
 *   B b = new D();    对的
 *
 *
 *
 *
 *
 */


